home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / dev / c / amcsrc2.lha / AMCSources2 / FFT / RI2M.c < prev    next >
C/C++ Source or Header  |  1996-06-06  |  3KB  |  136 lines

  1. /*    name...
  2.         ri2mag - convert frequencies with real & imaginary parts to frequencies
  3.                 with magnitudes
  4.     bugs...
  5.         should read in all data, then write, so disk head doesn't have
  6.         to move between input and output file.
  7. */
  8. #include <stdio.h>
  9. #include <math.h>
  10.  
  11. #define VERSION "1.1"
  12. #define MAXLABELS 50
  13. #define BUFSIZE 200
  14.  
  15. FILE *ifile=stdin, *ofile=stdout;
  16.  
  17. char buffer[128], oname[35];
  18. char buf[BUFSIZE];
  19.  
  20. int automatic_abscissas, /* nonzero if abscissas to be calculated */
  21. abscissa_arguments;
  22.  
  23. double
  24. abscissa,
  25. abscissa_step;
  26.  
  27.  
  28. main(argc, argv) int argc; char **argv;
  29. {//    int i;
  30.  
  31. //    double amp, phase, factor, q, pi, time, dt;
  32. //    double this, big, sweep, scale;
  33.  
  34.     {double junk;
  35.     sscanf("3.4","%lf",&junk);        /* workaround for DESMET sscanf bug */
  36.     }
  37.  
  38.     argc = args(argc, argv);
  39.     read_data(argc, argv);
  40.  
  41.     if(ofile!=stdout)
  42.         {fclose(ofile);
  43.         }
  44. }
  45.  
  46.  
  47.  
  48. read_data(argc, argv) int argc; char **argv;
  49. {//    int i,j,ac;
  50.         int nums;
  51.     double ff, xx, yy;
  52.     char *s, *t;
  53. //        char *stop, **av;
  54.     char *strchr();
  55.  
  56.     argc--; argv++;
  57.     if(strchr(argv[0], '?')) help();
  58.  
  59. /*            open input file         */
  60.     if(argc)
  61.         {ifile=fopen(argv[0], "r");
  62.         if(ifile==0) {printf("file %s not found\n", argv[0]); exit(1);}
  63.         argc--; argv++;
  64.         }
  65. /*            open output file         */
  66.     if(argc)
  67.         {strcpy(oname, argv[0]);
  68.         unlink(oname);
  69.         if((ofile=fopen(oname, "w"))==0)
  70.             {fprintf(stderr, "can\'t open output file");
  71.             exit(1);
  72.             }        
  73.         }
  74.  
  75.     fprint_cmd(stdout, "Computing... %s\n");
  76.  
  77.     while(fgets(buf, BUFSIZE, ifile))
  78.         {t=buf;
  79.         while(*t && isspace(*t)) t++;
  80.         if(*t == 0) continue;        /* skip blank lines */
  81.         buf[strlen(buf)-1]=0;        /* zero out the line feed */
  82.         if(buf[0]==';')                /* copy comment */
  83.             {fprintf(ofile, "%s\n", buf); continue;
  84.             }
  85.         if(t = strchr(buf, ';')) *t=0;    /* zap same-line comment */
  86.         if(automatic_abscissas)
  87.             {ff=abscissa;
  88.             abscissa+=abscissa_step;
  89.             sscanf(buf, "%lf %lf", &xx, &yy);
  90.             }
  91.         else
  92.             {sscanf(buf, "%lf %lf %lf", &ff, &xx, &yy);
  93.             }
  94.         s=buf;                      /* start looking for label */
  95.         nums=3;
  96.         if(automatic_abscissas) nums--;
  97.         while(nums--)                    /* skip the numbers */
  98.             {while(*s==' ')s++;
  99.             while(*s && (*s!=' '))s++;
  100.             }
  101.         while(*s==' ')s++;
  102.         fprintf(ofile, "%15.8g %15.8g %s\n", ff, sqrt(xx*xx + yy*yy), s);
  103.         }
  104. }
  105.  
  106. int streq(a,b) char *a,*b;
  107. {    while(*a)
  108.         {if(*a!=*b)return 0;
  109.         a++; b++;
  110.         }
  111.     return (*b==0);
  112. }
  113.  
  114. /* get_parameter - process one command line option
  115.         (return # parameters used) */
  116. get_parameter(argc, argv) int argc; char **argv;
  117. {    int i;
  118.     if(streq(*argv, "-a"))
  119.         {i=get_double(argc, argv, 2, &abscissa_step, &abscissa, &abscissa);
  120.         abscissa_arguments=i-1;
  121.         automatic_abscissas=1;
  122.         return i;
  123.         }
  124.     else gripe(argv);
  125. }
  126.  
  127. char *message[]={
  128. "ri2m   version ", VERSION,
  129. " - convert real & imag parts to magnitude\n",
  130. "usage: ri2m  infile  [outfile]  [options]\n",
  131. "options are:\n",
  132. "  -a  [step [start]] automatic abscissas \n",
  133. 0
  134. };
  135.  
  136.